/**
 * 20220304:[require] to [import]...jordia
 */
import {MathUtils} from 'three';
/**
 * 中断器
 * 使用流程
 * 1.实例化后先指定取值（get）及赋值（set）函数
 * 2.指定进入中断状态时应赋予的值（inValue）
 * 3.（可选）指定强制赋值开启时，退出中断状态时应赋的值（outValue）
 * 4.（可选）设置退出中断状态时是使用记录值还是退出值（enforce）
 * 5.interrupt：true 进入中断状态，记录此时的值_oldValue并set（inValue）
 * 6.interrupt：false 退出中断状态，set（oldValue）或set（outValue）
 *
 * 拖动组件与相机组件的中断示例：
 *      let br=new Breaker();
 *      br.get=()=>{
 *                camCtr.releaseUnfinishedEvent();
 *                return camCtr.enabled;
 *          };                                      记录相关组件状态的方法（释放相机控制挂起事件，并返回相机控制当前是否可用）
 *      br.set=(value)=>{
 *                camCtr.releaseUnfinishedEvent();
 *                camCtr.enabled=value;
 *          };                                      对相关组件进行赋值的方法（释放相机控制挂起事件，并启用/禁用相机控制）
 *      br.inValue=false;                           中断进入时禁用相机控制（inValue=false）
 *      drag.addBreaker(br);                        将中断器添加到drag组件
 *      br.outValue=true;                           设置中断退出时启用相机控制（如果enforce=true，否则使用记录值）
 *      br.enforce=true;                            中断退出时不使用记录值，而强制启用相机控制（因为outValue=true）
 *
 *      相应drag组件中pointerMove时：
 *          br.interrupt=true;
 *      相应drag组件中pointerOut时：
 *          br.interrupt=false;
 */
export default class Breaker{
    constructor(){
        this._init();
    }

    /**
     * 类型名
     * @returns {string}
     */
    get type(){
        return 'Breaker';
    }

    /**
     * 唯一ID
     * @returns {null|string}
     */
    get uuid(){
        return this._uuid;
    }

    /**
     * 中断与否
     * @param bol {boolean} true：进入中断状态，false：退出中断状态继续
     */
    set interrupt(bol){
        if(bol){
            if(this._getCall)this._oldValue=this._getCall();
            if(this._setCall)this._setCall(this._breakValue);
        }else{
            if(!this._setCall)return;
            if(!this._enforce){
                this._setCall(this._oldValue);
                return;
            }
            this._setCall(this._continueValue);
        }
    }

    /**
     * 设置取值函数
     * @param func_return_value
     */
    set get(func_return_value){
        this._getCall=func_return_value;
    }

    /**
     * 设置赋值函数
     * @param func_paras_value
     */
    set set(func_paras_value){
        this._setCall=func_paras_value;
    }

    /**
     * 中断状态的值
     * @param any
     */
    set inValue(any){
        this._breakValue=any;
    }

    /**
     * 退出中断状态的值（强制赋值时使用）
     * @param any
     */
    set outValue(any){
        this._continueValue=any;
    }

    /**
     * 退出中断状态时是否强制赋值
     * @param bol
     */
    set enforce(bol){
        if(bol){
            this._enforce=true;
            return;
        }
        this._enforce=false;
    }

    /**
     * 销毁
     */
    dispose(){
        this._uuid=null;
        this._getCall=null;
        this._setCall=null;
        this._breakValue=null;
        this._oldValue=null;
        this._continueValue=null;
        this._enforce=false;
    }

    _init(){
        this._initVariable();
    }
    _initVariable(){
        this._uuid=MathUtils.generateUUID();
        this._getCall=null;
        this._setCall=null;
        this._breakValue=null;
        this._oldValue=null;
        this._continueValue=null;
        this._enforce=null;
    }
}